package com.syedu.day16;

import java.io.File;
import java.io.IOException;

/**
 * description：java.io.File类,该类是用来映射/创建本地或者远程的文件/文件夹
 * @author Administrator
 * @date 2022/4/6 9:53
 */
public class FileDemo {
    public static void main(String[] args) {
        /**
         * 关于路径中的斜杠
         * 正斜杠  /                                  远程资源路径中使用
         * 反斜杠  \\   双写转译,避免和\n,\t等冲突       本地资源路径中使用(windows)
         *
         * 注意: 斜杠在不同的操作系统中的使用也是不一定相同的!!!所以,如果要通用,则必须使用Java提供的
         * 常量File.separator,它可以自动根据当前环境来使用正确对应的斜杠
         */
        //创建File实例
        //File file = new File("D:\\阿里巴巴Java开发手册终极版v1.3.0.pdf");
        File file = new File("D:" + File.separator + "阿里巴巴Java开发手册终极版v1.3.0.pdf");

        /**
         * 读取文件相关信息
         * 注意: 读取的信息是文件的参数信息,非文件内部的内容,要读取文件里面的内容,必须使用IO流
         */
        //获取文件名
        System.out.println(file.getName());
        //获取文件的绝对路径
        System.out.println(file.getAbsolutePath());
        //获取文件大小,注意: 如果File映射的是文件夹,则此方法无法获取确定的长度
        System.out.println(file.length());
        //获取最后一次修改的时间
        System.out.println(file.lastModified());
        //判断文件是否可读,可写,隐藏
        System.out.println(file.canRead());
        System.out.println(file.canWrite());
        System.out.println(file.isHidden());
        //判断文件是否是文件还是文件夹
        System.out.println(file.isFile());
        System.out.println(file.isDirectory());
        //判断文件或者文件夹是否存在
        System.out.println(file.exists());

        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>");

        //createFile("D:\\test.txt");

        //createFolder("D:\\java学习\\io");

        //deleteFileOrFolder("D:\\java学习");

        showFolder("C:\\Program Files\\Java\\jdk-17.0.1\\bin");
    }

    /**
     * 创建文件
     */
    public static void createFile(String path) {
        if (path != null) {
            File file = new File(path);
            //判断File是否已经存在
            //if (!file.exists()) {
            try {
                /**
                 * 创建文件
                 * 注意: 此方法返回boolean,如果文件不存在,并且创建成功,则返回true
                 */
                boolean newFile = file.createNewFile();
                if (newFile) {
                    System.out.println(path + ",创建成功!");
                } else {
                    System.out.println(path + ",文件已存在...");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
           /* } else {
                System.out.println("目标文件已存在!");
            }*/
        } else {
            System.out.println("目标路径不能为空!");
        }
    }

    /**
     * 创建文件夹
     */
    public static void createFolder(String path) {
        if (path != null) {
            File file = new File(path);
            //注意: mkdirs可以创建多层路径,而mkdir方法只能创建单层
            boolean mkdirs = file.mkdirs();
            if (mkdirs) {
                System.out.println(path + ",创建成功!");
            } else {
                System.out.println(path + ",创建失败...");
            }
        } else {
            System.out.println("目标路径不能为空!");
        }
    }

    /**
     * 删除文件或者文件夹
     * 注意: delete()方法可以删除文件或者空的文件夹,如果文件夹中有内容,则无法删除!
     */
    public static void deleteFileOrFolder(String path) {
        if (path != null) {
            File file = new File(path);
            if (file.exists()) {
                boolean delete = file.delete();
                if (delete) {
                    System.out.println("删除成功!");
                } else {
                    System.out.println("删除失败!");
                }
            } else {
                System.out.println("目标文件不存在...");
            }
        } else {
            System.out.println("目标路径不能为空!");
        }
    }

    /**
     * 查看文件夹
     * 注意: list()或者listFile()方法默认只能获取当前文件夹下的内容,无法获取深层目录信息
     */
    public static void showFolder(String path) {
        if (path != null) {
            File file = new File(path);
            //把当前文件夹下所有的文件或者文件夹的名字(String)放入到数组中
            //String[] list = file.list();
            if (file.isDirectory()) {
                //把当前文件夹下所有的文件或者文件夹的File实例放入到数组中
                //File[] files = file.listFiles();

                //可以传入参数,来实现指定罗列符合规则的内容(过滤)
               /* File[] files = file.listFiles(new FilenameFilter() {
                    @Override
                    public boolean accept(File dir, String name) {
                        //添加过滤规则,必须是.exe文件
                        return new File(dir,name).getName().endsWith(".exe");
                    }
                });*/

                //添加过滤规则,必须是.exe文件
                File[] files = file.listFiles((dir, name) -> new File(dir, name).getName().endsWith(".dll"));

                //遍历
                for (File f : files) {
                    if (f.isFile()) {
                        System.out.println("文件名: " + f.getName() + ",文件大小:" + f.length());
                    } else {
                        System.out.println("文件夹名: " + f.getName());
                    }
                }
            } else {
                System.out.println("目标不是目录!");
            }
        } else {
            System.out.println("目标路径不能为空!");
        }
    }
}